Large scale networks support a wide variety of applications and services. Such networks may include multiple devices distributed across links in an interconnection network or switch fabric. Each node of the network may include a switch (e.g., a router) or an endpoint (e.g., a host device). Network congestion can occur when a link or node carries too much data so as to cause deterioration in the quality of service. Typically, the effects of network congestion include queuing delay, packet loss, or the blocking of new connections. Congestion across the network can be controlled by protocols, such as the Transmission Control Protocol (“TCP”), which maintains a similar bandwidth for competing connections. TCP also ensures that the overall transmission rates are less than the link capacity.
One of the limitations of TCP is that it focuses on the number of connections being made to an endpoint at any given time. Accordingly, a user of the network can easily access additional bandwidth by simply implementing additional connections to the network. This practice is becoming increasingly prevalent in larger scale distributed systems where a user's job is spread across many machines. For example, if a first user is running a job on 100 machines and a second user is running a job on 10 machines, the first user may have access to 10 times the bandwidth of the second user. This is not desirable for many networks, as it creates what is considered an unfair allocation of bandwidth.